#version 330 core
out vec4 FragColor;

uniform vec3 objectColor;
uniform vec3 lightColor;

uniform vec3 lightPos;
uniform vec3 viewPos; // 观察者的世界空间坐标，即摄像机的位置

in vec3 Normal;
in vec3 FragPos;

void main()
{
  //ambient
  float ambient = 0.1f;

  //diffuse
  vec3 norm = normalize(Normal);
  vec3 lightDir = normalize(lightPos - FragPos); // 从片段指向光源
  float diffuse = max(dot(norm, lightDir), 0.0f);

  //specular
  vec3 viewDir = normalize(viewPos - FragPos);
  vec3 reflectDir = reflect(-lightDir, norm); // 沿着法线轴的反射向量
  float specularStrength = 0.5f; // 定义一个镜面强度(Specular Intensity)变量，给镜面高光一个中等亮度颜色，让它不要产生过度的影响
  float specular = pow(max(dot(viewDir, reflectDir), 0.0f), 64) * specularStrength; // 64是反光度(Shininess)。一个物体的反光度越高，反射光的能力越强，散射得越少，高光点就会越小

  //all
  vec3 result =  (ambient + diffuse + specular) * lightColor * objectColor;
  FragColor = vec4(result, 1.0f);

}
